package com.Jano.filter;

import com.Jano.dto.Result;
import com.alibaba.fastjson.JSON;

import org.apache.commons.io.IOUtils;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Console;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Objects;

import static com.Jano.constant.BusinessConstant.SESSION_USER;


/**
 * Session验证过滤器
 * 有了这个过滤器以后，所有需要基于才能访问的路径，本来在获取用户信息的时候都要做判空操作
 * 此时判空操作都不需要了，因为通过这个过滤器过滤以后，所有需要登录才能访问而没有登录的请求
 * 会在这个过滤器中直接被中断，而能够走到Servlet的请求一定是配置文件中没有配置或者配置文件
 * 中有但是当前用户已经登录了
 */
public class SessionFilter implements Filter {
    private List<String> sessionInteceptorUris;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //读取记录需要拦截的路径的那个文件
        try (InputStream is = SessionFilter.class.getClassLoader().getResourceAsStream("session-inteceptor-uris")) {
            sessionInteceptorUris = IOUtils.readLines(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        //根据当前的请求路径判断该路径是否在需要验证登录的这些路径中，如果在则进行验证
        String uri = req.getRequestURI();
        System.out.println(uri);
        //1.如果这个路径不需要拦截
        if (!sessionInteceptorUris.contains(uri)) {
            filterChain.doFilter(req, res);
        }
        //2.如果这个路径需要拦截
        else {
            //获取当前登录的用户信息
            Object sessionUserObj = req.getSession().getAttribute(SESSION_USER);
            //(1)如果没有
            if (Objects.isNull(sessionUserObj)) {
                res.setContentType("application/json;charset=utf-8");
                Result result = new Result();
                result.setSuccess(false);
                result.setErrMsg("请先进行登录");
                res.getWriter().print(JSON.toJSONString(result));
            }
            //(2)如果有
            else {
                filterChain.doFilter(req, res);
            }
        }
    }

    @Override
    public void destroy() {

    }
}
